package ReflectDemo;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//反射获取成员方法并使用
public class ReflectDemo6 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<?> aClass = Class.forName("ReflectDemo.Stu");
        // Method[] getMethods() : 返回一个方法对象数组，方法对象反映由该Class对象表示的类或接口的所有公共方法，包括继承自父类或超类的方法
        // Method[] getDeclaredMethods() : 返回一个包含方法对象的数组，方法对象反映由Class对象表示的类或接口的所有声明方法
        //Method[] methods = aClass.getMethods();
        Method[] methods = aClass.getDeclaredMethods();
        for(Method method : methods)
            System.out.println(method);
        System.out.println("--------");

        Method method1 = aClass.getMethod("method1");

        //获取无参构造方法并创建对象

        Constructor<?> con = aClass.getConstructor();
        Object obj = con.newInstance();

        //在类或接口上提供有关单一方法的信息和访问权限
        //Object invoke (Object obj , Object... args) 在具有指定参数的指定对象上调用此方法对象表示的基础方法
        //Object : 返回值类型
        //obj : 调用方法的对象
        //args : 方法需要的参数

        method1.invoke(obj);

    }
}
